home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 8: LINUX Games / Linux Cubed Series 8 - LINUX Games.iso / games / video / fly8111-.000 / fly8111- / fly8 / lamps.c < prev    next >
C/C++ Source or Header  |  1979-12-31  |  3KB  |  158 lines

  1. /* --------------------------------- lamps.c -------------------------------- */
  2.  
  3. /* This is part of the flight simulator 'fly8'.
  4.  * Author: Eyal Lebedinsky (eyal@ise.canberra.edu.au).
  5. */
  6.  
  7. /* Show indicators display (HDD_LAMPS).
  8. */
  9.  
  10. #include "plane.h"
  11.  
  12.  
  13. /* Show one lamp, handling color and blinking.
  14. */
  15.  
  16. LOCAL_FUNC void NEAR
  17. lamp_show (OBJECT *p, int x, int y, int ss, int lamp, char *name, int color)
  18. {
  19.     int    blink;
  20.     int    state;
  21.  
  22.     blink = (Uint)st.present % 512 > (512/3);    /* 2Hz, 2/3 duty */
  23.     state = EX->lamps[lamp];
  24.  
  25.     if ((state & LAMP_MRED) && (blink || !(state & LAMP_BRED)))
  26.         color = CC_RED;
  27.     else if ((state & LAMP_MGREEN) && (blink || !(state & LAMP_BGREEN)))
  28.         color = CC_GREEN;
  29.  
  30.     if (color >= 0)
  31.         stroke_str (x, y, name, ss, color);
  32. }
  33.  
  34. /* Show the bottom-line message. If it is too long then scroll it.
  35. */
  36.  
  37. LOCAL_FUNC void NEAR
  38. ad_show (int x, int y, int ss, int size, char *ad, int color)
  39. {
  40.     int    pix, off, t;
  41.  
  42.     pix = stroke_size (ad, ss);        /* total pixels */
  43.  
  44.     if (pix <= size) {
  45.         size += x;            /* right margin */
  46.         off = 0;
  47.     } else {
  48.         pix -= size + 1;        /* scrolled pixels */
  49.         size += x;            /* right margin */
  50.         off = (Uint)(st.present >> 4) % (pix+40);    /* 64pix/sec */
  51.         if (off > pix) {
  52.             if (off > pix+20)
  53.                 off = 0;    /* pause at start */
  54.             else
  55.                 off = pix;    /* pause at end */
  56.         }
  57.         x -= off;
  58.     }
  59.  
  60.     size -= num_size (9L, ss) - 1;        /* guard right margin */
  61.     for (pix = 0; *ad; ++ad) {
  62.         if (pix < off)
  63.             t = char_size (*ad, ss);
  64.         else {
  65.             if (x > size)
  66.                 break;
  67.             t = stroke_char (x, y, *ad, ss, color);
  68.         }
  69.         pix += t;
  70.         x += t;
  71.     }
  72. }
  73.  
  74. /* Show the lamp display.
  75. */
  76.  
  77. extern void FAR
  78. show_lamps (VIEW *view, OBJECT *p, int maxx, int maxy, int orgx, int orgy,
  79.     int ss)
  80. {
  81.     int    x1, x2, x3, x4, xr, y0, y1, y2, y3, y4, y5;
  82.     int    t, dy;
  83.     char    *ad;
  84.     HMSG    *q;
  85.  
  86.     y0 = orgy - maxy;        /* top margin */
  87.  
  88.     dy = (maxy * 2) / 5;        /* line spacing */
  89.     if (ss < dy - 2)
  90.         ss = dy - 2;
  91.     t = (num_size (9L, ss) * 6 + 2) * 4 / 2;
  92.     if (t > maxx)
  93.         ss = muldiv (ss, maxx, t);
  94.  
  95.     x1 = orgx - maxx;        /* left   column */
  96.     x2 = orgx - maxx/2 + 2;
  97.     x3 = orgx + 2;
  98.     x4 = orgx + maxx/2 + 2;        /* right  column */
  99.     xr = orgx + maxx;        /* right margin */
  100.  
  101.     y1 = y0 + dy;            /* top line */
  102.     y2 = y1 + dy;
  103.     y3 = y2 + dy;
  104.     y4 = y3 + dy;
  105.     y5 = y4 + dy;            /* bottom line */
  106.  
  107. /* Show grid.
  108. */
  109.     if (!(st.flags & SF_BLANKER)) {
  110.         gr_color (CC_GRAY);
  111.         gr_move (x2-2, y0);
  112.         gr_draw (x2-2, y4);
  113.         gr_move (x3-2, y0);
  114.         gr_draw (x3-2, y4);
  115.         gr_move (x4-2, y0);
  116.         gr_draw (x4-2, y4);
  117.  
  118.         gr_move (x1-1, y1+1);
  119.         gr_draw (xr,   y1+1);
  120.         gr_move (x1-1, y2+1);
  121.         gr_draw (xr,   y2+1);
  122.         gr_move (x1-1, y3+1);
  123.         gr_draw (xr,   y3+1);
  124.         gr_move (x1-1, y4+1);
  125.         gr_draw (xr,   y4+1);
  126.     }
  127.  
  128. /* Show lamps.
  129. */
  130.     t = (st.flags & SF_BLANKER) ? -1 : CC_GRAY;
  131.  
  132.     if (IS_PLANE(p)) {
  133.         lamp_show (p, x1, y1, ss, LAMP_GLIMIT, "GLIMIT", t);
  134.         lamp_show (p, x2, y1, ss, LAMP_STALL,  " STALL", t);
  135.         lamp_show (p, x3, y1, ss, LAMP_FUEL,   " FUEL ", t);
  136.         lamp_show (p, x4, y1, ss, LAMP_GEAR,   " GEAR ", t);
  137.  
  138.  
  139.         lamp_show (p, x1, y2, ss, LAMP_ALT,    " ALT  ", t);
  140.         lamp_show (p, x2, y2, ss, LAMP_PULLUP, "PULLUP", t);
  141.         lamp_show (p, x4, y2, ss, LAMP_EJECT,  " EJECT", t);
  142.  
  143.         lamp_show (p, x1, y3, ss, LAMP_DAMAGE, "DAMAGE", t);
  144.     }
  145.  
  146. /* Show last, most urgent message on screen.
  147. */
  148.     t = -1;
  149.     ad = welcome (-1);
  150.     for (q = st.msg; q; q = q->next) {
  151.         if (t < (int)q->flags) {
  152.             t = (int)q->flags;
  153.             ad = q->text;
  154.         }
  155.     }
  156.     ad_show (x1, y5, ss, 2*maxx, ad, ST_HFG);
  157. }
  158.